package com.example.demo.dao.impl;

import com.example.demo.dao.BaseDao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.ParameterizedType;

/**
 * Created by Administrator on 2017/10/26 0026.
 */
@Transactional// 这个必须加，具体还没太懂:
public class BaseDaoImpl<T> implements BaseDao<T> {

    private Class<T> clazz; //T的具体类

    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    /**
     * 通过构造方法指定DAO的具体实现类
     */
    public BaseDaoImpl() {
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class<T>) type.getActualTypeArguments()[0];
    }

    /**
     * 获取当前可用的Session对象
     *
     * @return
     * @author: azzcsimp
     * @Createdate: 2014年6月12日 下午3:49:53
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public T findById(Long id) {
        Session session = this.getSession();
        T obj = null;
        obj = session.get(clazz, id);
        return obj;
    }

    @Override
    public void saveOrUpdate(T t) {
        getSession().saveOrUpdate(t);
    }
}
